function init(matrix) {
  const len = matrix.length;
  let res = {
    p_edgeNum: 0,
    n_edgeNum: 0,
    rows_p_edgeNum: new Array(len),
    rows_n_edgeNum: new Array(len),
  };
  for (let i = 0; i < len; i++) {
    res.rows_p_edgeNum[i] = 0;
    res.rows_n_edgeNum[i] = 0;
    for (let j = 0; j < len; j++) {
      if (matrix[i][j] === 1) {
        res.rows_p_edgeNum[i]++;
      } else if (matrix[i][j] === -1) {
        res.rows_n_edgeNum[i]++;
      }
    }
  }
  res.p_edgeNum = res.rows_p_edgeNum.reduce((sum, item) => sum + item) / 2;
  res.n_edgeNum = res.rows_n_edgeNum.reduce((sum, item) => sum + item) / 2;
  return res;
}
export { init };
function getModularity(matrix, labels, edgeData = init(matrix)) {
  const len = matrix.length;
  let sum = 0;
  if (edgeData.n_edgeNum === 0) {
    for (let i = 0; i < len; i++) {
      for (let j = 0; j < len; j++) {
        if (i !== j && labels[i] === labels[j]) {
          sum +=
            matrix[i][j] -
            (edgeData.rows_p_edgeNum[i] * edgeData.rows_p_edgeNum[j]) / (2 * edgeData.p_edgeNum);
        }
      }
    }
  } else {
    for (let i = 0; i < len; i++) {
      for (let j = 0; j < len; j++) {
        if (i !== j && labels[i] === labels[j]) {
          sum +=
            matrix[i][j] -
            ((edgeData.rows_p_edgeNum[i] * edgeData.rows_p_edgeNum[j]) / (2 * edgeData.p_edgeNum) -
              (edgeData.rows_n_edgeNum[i] * edgeData.rows_n_edgeNum[j]) / (2 * edgeData.n_edgeNum));
        }
      }
    }
  }
  return sum / ((edgeData.p_edgeNum + edgeData.n_edgeNum) * 2);
}
export { getModularity };
